package model;

import controller.Cliente;
import java.sql.Connection;
import java.sql.PreparedStatement;

import controller.Conta;
import controller.ContaCorrente;
import controller.ContaInvestimento;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.ArrayList;

/**
*
* @author Juliane
*/
public class ContaDAO {
	
	private Connection con;
	private PreparedStatement stmtAtualiza;
        private PreparedStatement stmtBuscaTipo;
        private PreparedStatement stmtBuscaCliente;
        private PreparedStatement stmtBuscaNConta;
        private PreparedStatement stmtListar;
        private PreparedStatement stmtNconta;
	private PreparedStatement stmtBuscaConta;
        
	public ContaDAO() throws Exception{
		con = ConFactory.getConnection();
		stmtAtualiza = con.prepareStatement("UPDATE conta SET saldo = ? WHERE nconta = ?");
                stmtBuscaTipo = con.prepareStatement("SELECT tipo FROM conta WHERE nconta = ?");
                stmtBuscaCliente = con.prepareStatement("SELECT nome, sobrenome FROM cliente WHERE nconta = ?");
                stmtBuscaNConta = con.prepareStatement("SELECT nconta FROM conta WHERE cpf = ?");
                stmtListar = con.prepareStatement("SELECT * FROM conta");
                stmtNconta = con.prepareStatement("SELECT nconta FROM conta");
                stmtBuscaConta = con.prepareStatement("SELECT * FROM conta WHERE nconta = ?");
	}
	
	public ContaDAO(Connection con) throws Exception{
		this.con = con;
		stmtAtualiza = con.prepareStatement("UPDATE conta SET saldo = ? WHERE nconta = ?");
                stmtBuscaTipo = con.prepareStatement("SELECT tipo FROM conta WHERE nconta = ?");
                stmtBuscaCliente = con.prepareStatement("SELECT nome, sobrenome FROM cliente WHERE nconta = ?");
                stmtBuscaNConta = con.prepareStatement("SELECT nconta FROM conta WHERE cpf = ?");
                stmtListar = con.prepareStatement("SELECT * FROM conta");
                stmtNconta = con.prepareStatement("SELECT nconta FROM conta");
                stmtBuscaConta = con.prepareStatement("SELECT * FROM conta WHERE nconta = ?");
	}
	
	public void atualizaConta(Conta conta) throws Exception{
		stmtAtualiza.setDouble(1, conta.getSaldo());
		stmtAtualiza.setInt(2, conta.getNconta());
                stmtAtualiza.executeUpdate();
	}
        
        //Busca o tipo da conta no Banco de dados
        public String buscarTipoConta(int nConta) throws Exception{
            stmtBuscaTipo.setInt(1, nConta);
            ResultSet rs = stmtBuscaTipo.executeQuery();
            rs.next();
            int tipo = rs.getInt("tipo");
            if (tipo == 1){
                return "CONTA CORRENTE";
            } 
            else if (tipo == 2){
                return "CONTA INVESTIMENTO";
            }
            else
                return "INVÁLIDO";
        }
        
        //Busca o nome e o sobrenome do cliente pelo numero da conta
        public String buscarClienteConta(int nconta) throws Exception{
            stmtBuscaCliente.setInt(1, nconta);
            ResultSet rs = stmtBuscaCliente.executeQuery();
            rs.next();
            String nome = rs.getString("nome") + " " + rs.getString("sobrenome");
            return nome;
        }
        
        //Busca o numero da conta pelo cpf do cliente
        public int buscarNConta(String cpf) throws Exception{
            stmtBuscaNConta.setString(1, cpf);
            ResultSet rs = stmtBuscaNConta.executeQuery();
            rs.next();
            int nconta = rs.getInt("nconta");
            return nconta;
        }
        
        public List<Conta> listarConta() throws SQLException{
            ResultSet rs = stmtListar.executeQuery();
            List<Conta> lista = new ArrayList();
            while(rs.next()){
                if(rs.getInt("tipo") == 1){
                    ContaCorrente conta = new ContaCorrente(rs.getInt("nconta"), rs.getDouble("depini"), rs.getDouble("saldo"), rs.getDouble("limite"));
                    lista.add(conta);
                }else{
                    ContaInvestimento conta = new ContaInvestimento(rs.getInt("nconta"), rs.getDouble("depini"), rs.getDouble("saldo"), rs.getDouble("montmin"), rs.getDouble("depmin"));
                    lista.add(conta);
                }
            }
            return lista;
        }
        
        public Conta buscarConta(int nConta) throws SQLException{
        //Conta conta = new ContaCorrente();
            stmtBuscaConta.setInt(1, nConta);
            ResultSet rs = stmtBuscaConta.executeQuery();
            rs.next();
            int tipo = rs.getInt("tipo");

            if(tipo == 1){
                ContaCorrente conta = new ContaCorrente(nConta, rs.getDouble("depini"), rs.getDouble("saldo"), rs.getDouble("limite"));
                return conta;
            }else{
                ContaInvestimento conta = new ContaInvestimento(nConta, rs.getDouble("depini"), rs.getDouble("saldo"),rs.getDouble("montmin") ,rs.getDouble("depmin"));
                return conta;
            }
        }
}
